//
//  ViewController.swift
//  Swift列表显示
//
//  Created by 伍银荣 on 2021/12/9.
//  Copyright © 2021 com.WYR. All rights reserved.
//

/**
 * 1.显示tableViewController
 * 2.创建模型,加载数据,利用闭包模拟网络异步加载
 * 3.自定义 cell, 绑定 cell
 * 4.点击 cell 跳转进入 detailVC,将cell的值传给detailVC
 * 5.保存数据,刷新tableView,显示 cell 的数据
 */


import UIKit

class ViewController: UITableViewController {

    private var personData: [PersonData]?
    override func viewDidLoad() {
        super.viewDidLoad()
        loadData { (array) in
            //接收到回调参数
//            print(array)
            self.personData = array
            self.tableView.reloadData()
        }
    }
}

//MARK: - 跳转到detailVC
extension ViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        //获取目标控制器
        guard let detailVC = segue.destination as? DetailViewController else {
            return
        }
        //获取用户当前选中行数据
        guard let indexPath = tableView.indexPathForSelectedRow else {
            return
        }
        //传递数据
        //1> 个人记录
        detailVC.data = personData![indexPath.row]
        
        //2> 完成回调
//        detailVC.didSavedCallBack = {
//            //刷新表格
//            self.tableView.reloadData()
//        }
        
        //简单写法 - 传递了一个可以执行的函数
        detailVC.didSavedCallBack = self.tableView.reloadData
        
    }
}

//MARK: - 数据源方法
extension ViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.personData?.count ?? 0
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "listCell", for: indexPath) as! ListCell
        //为什么可以强行解包, 只有 personData 这个变量有值才可以调用数据源方法
        //此时 personData 一定是有内容的
        cell.personData = self.personData![indexPath.row]
        return cell
    }
}

// MARK: - 数据处理
// extension 类似于 OC 中的分类,可以将控制器的代码分组,便于维护和管理
extension ViewController {
    //加载数据 -> 字典数组 -> 模型数组
    private func loadData(completion: @escaping (_ array:[PersonData]) -> ()) {
        print("耗时操作")
        DispatchQueue.global().async {
            //拼接个人信息数组
            //创建数组
            var dataList = [PersonData]()
            //循环生成模拟数据
            for i in 0..<50 {
                let name = "王五 \(i)"
                //生成一个 0 ~ 19 的随机数
                let age = arc4random() % 20 + 10
                
                let dict: [String: AnyObject] = ["name": name as AnyObject, "age": age as AnyObject]
                //字典转模型, 追加到数组
                dataList.append(PersonData(dict: dict))
            }
           // print(dataList)
            //完成调用
            DispatchQueue.main.async {
                print("完成调用")
                completion(dataList)
            }
        }
    }
    
}

